package com.leyou.cart.service;

import com.leyou.auth.entiy.UserInfo;
import com.leyou.cart.filter.LoginInterceptor;
import com.leyou.cart.pojo.Cart;
import com.leyou.common.utils.JsonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class CollectService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Autowired
    private CartService cartService;

    //存入Redis数据的前缀，为了避免key值重复导致数据被覆盖
    private static final String KEY_PREFIX = "ly:collect:uid:";


    //添加商品到我的收藏，存入Redis
    //  存储结构是一个双层Map：Map<String,Map<String,String>>
    //- 第一层Map，Key是用户id
    //- 第二层Map，Key是商品id，值是购物车数据
    public void addCollect(Cart cart) {
        //获取登录用户
        UserInfo userInfo = LoginInterceptor.getLoginUser();
        //Redis中的Key使用当前登录用户的uid
        String key = KEY_PREFIX + userInfo.getId();

        //获取Redis中hash操作对象
        BoundHashOperations<String, Object, Object> ops = this.redisTemplate.boundHashOps(key);
        //查询是否存在数据
        Long skuId = cart.getSkuId();
        Boolean bool = ops.hasKey(skuId.toString());
        if (!bool) {
            //如果不存在数据，则新增商品到redis中
            //将用户的id添加到cart对象中
            cart.setUserId(userInfo.getId());
        }
        //最后把最新的cart数据写入redis中
        ops.put(cart.getSkuId().toString(), JsonUtils.serialize(cart));

        //上述操作成功之后，删除原购物车中的数据
        cartService.deleteCart(cart.getSkuId().toString());

    }

    //登录状态下查询购物车
    public List<Cart> queryCollects() {
        //查询登录用户
        UserInfo loginUser = LoginInterceptor.getLoginUser();
        //判断是否有收藏
        String key = KEY_PREFIX + loginUser.getId();
        Boolean bool = this.redisTemplate.hasKey(key);
        if (bool == false) {
            //收藏数据不存在，则直接返回，不做其他操作
            return null;
        }
        //若用户存在收藏数据，则接着判断其中是否有数据
        BoundHashOperations<String, Object, Object> ops = this.redisTemplate.boundHashOps(key);
        //取出其中的数据,并进行判断其中是否有数据
        List<Object> collects = ops.values();
        if (CollectionUtils.isEmpty(collects)) {
            return null;
        }
        //将数据取出并返回
        List<Cart> list = collects.stream()
                .map(collect -> JsonUtils.parse(collect.toString(), Cart.class)).collect(Collectors.toList());
        return list;
    }

    //登录状态下删除收藏数据
    public void deleteCollect(String skuId) {
        //查询用户信息
        UserInfo loginUser = LoginInterceptor.getLoginUser();
        String key = KEY_PREFIX + loginUser.getId();
        BoundHashOperations<String, Object, Object> ops = this.redisTemplate.boundHashOps(key);
        //删除指定skuId的商品
        ops.delete(skuId);
    }
}
